﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QuanLyHocPhi.GUI.DuLieu
{
    using Model;
    using BLL;
    using QuanLyHocPhi.BLL.Excel;
    /// <summary>
    /// Form nạp dữ liệu sinh viên không chuyên
    /// </summary>
    public partial class FormSinhVienKhongChuyen_Import : QuanLyHocPhi.GUI.FormBaseDialog
    {
        private Truong m_Truong = null;
        private HocKy m_HocKy = null;

        /// <summary>
        /// Hàm khởi dựng
        /// </summary>
        /// <param name="truong"></param>
        public FormSinhVienKhongChuyen_Import(Truong truong)
        {
            InitializeComponent();
            m_Truong = truong;
        }

        /// <summary>
        /// Đóng cửa sổ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnCloseClick(object sender, EventArgs e)
        {
            this.Close();
        }

        #region private string FileName;
        private string m_FileName;
        private string FileName
        {
            get { return m_FileName; }
            set
            {
                m_FileName = value;
                txtFileName.Text = m_FileName;
                NapThongTinDataSource();
            }
        }
        #endregion

        #region Nạp thông tin của nguồn dữ liệu
        private void OnRefreshSheetListLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            NapThongTinDataSource();
        }

        private void NapThongTinDataSource()
        {
            try
            {
                ExcelImporter excel = new ExcelImporter(this.FileName);
                var lst = excel.GetTableList();
                var lst2 = new List<string>();
                foreach (var item in lst)
                {
                    var item2 = item;
                    item2 = item.Replace("'", "");
                    if (item2.EndsWith("$Print_Titles")
                        || item2.EndsWith("$_FilterDatabase")
                        || item2.EndsWith("_"))
                        continue;
                    lst2.Add(item2);
                }
                bsSheet.DataSource = lst2;
                cbxSheet.DataSource = bsSheet;
                cbxSheet.Enabled = bsSheet.Count > 0;
                bsSinhVien.DataSource = null;
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(exc.Message);
            }
        }
        #endregion

        private void OnSelectFileLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "Tập tin Excel (*.xls)|*.xls|Tất cả (*.*)|*.*";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                this.FileName = dlg.FileName;
            }
        }

        private void OnDocDuLieuClick(object sender, EventArgs e)
        {
            // Lấy thông tin sheetName, startCell, endCell
            string sheetName = null;
            if (cbxSheet.SelectedValue != null)
                sheetName = cbxSheet.SelectedValue.ToString();
            string startCell = txtStartCell.Text.Trim();
            string endCell = txtEndCell.Text.Trim();

            if (sheetName.IsNullOrEmpty())
            {
                DialogUtils.ShowError("Phải chọn sheet để nạp dữ liệu!");
                return;
            }

            // Xử lý dữ liệu
            try
            {
                gridSinhVien.DataSource = null;
                btnNapDuLieu.Enabled = false;

                ExcelImporter excel = new ExcelImporter(this.FileName);
                DataTable dt = excel.ReadData(sheetName: sheetName, headerEnable: true, startCell: startCell, endCell: endCell);
                var datacolumns = dt.Columns;
                bool coDayDuCacCot = datacolumns.Contains(BizSinhVien.Col_MaSinhVien)
                    && datacolumns.Contains(BizSinhVien.Col_HoDem)
                    && datacolumns.Contains(BizSinhVien.Col_Ten)
                    && datacolumns.Contains(BizSinhVien.Col_NgaySinh)
                    && datacolumns.Contains(BizSinhVien.Col_TenLopGoc)
                    && datacolumns.Contains(BizSinhVien.Col_SoTien)
                    && datacolumns.Contains(BizSinhVien.Col_HeSoMienGiam)
                    && datacolumns.Contains(BizSinhVien.Col_TenLopHocPhan);
                if (coDayDuCacCot)
                {
                    #region Có đầy đủ các cột
                    gridSinhVien.AutoGenerateColumns = false;
                    bsSinhVien.DataSource = dt;
                    gridSinhVien.DataSource = bsSinhVien;
                    btnNapDuLieu.Enabled = true;
                    //foreach (DataRow row in dt.Rows)
                    //{
                    //    if (row[BizSinhVien.Col_MaSinhVien].ToString() == "08T1021045")
                    //    {
                    //        string stSoTien = Convert.ToString(row[BizSinhVien.Col_SoTien]);
                    //        DialogUtils.ShowMessage(stSoTien);
                    //    }
                    //}
                    #endregion
                }
                else
                {
                    #region Không hợp lệ
                    throw new Exception("Bảng tính Excel không có định dạng hợp lệ: MaSinhVien, HoDem, Ten, NgaySinh, TenLopGoc, SoTien, TenNhom, HeSoMienGiam");
                    #endregion
                }
            }
            catch (Exception exc)
            {
                bsSinhVien.DataSource = null;
                gridSinhVien.DataSource = bsSinhVien;
                DialogUtils.ShowError(exc.Message);
            }

        }

        private void OnBoSungSinhVienVaoHeThongClick(object sender, EventArgs e)
        {
            // Bổ sung sinh viên vào hệ thống
            try
            {
                DataTable dt = null;
                if (bsSinhVien.DataSource != null)
                    dt = bsSinhVien.DataSource as DataTable;
                if (dt == null)
                    throw new Exception("Chưa có dữ liệu sinh viên!");
                int nInserted = BizSinhVien.AddNew_SinhVienKhongChuyen(dt);
                DialogUtils.ShowMessage(string.Format("Đã ghi nhận được {0} sinh viên vào hệ thống", nInserted));
                btnDocDuLieu.PerformClick();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(exc.Message);
            }
        }

        private void OnGridSinhVienDataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            //foreach (DataGridViewRow row in gridSinhVien.Rows)
            //{
            //    DataRowView drow = row.DataBoundItem as DataRowView;
            //    var cellHeSoMienGiam = row.Cells[colSinhVien_HeSoMienGiam.Index];
            //    try
            //    {
            //        double heSoMienGiam = Convert.ToDouble(drow[BizSinhVien.Col_HeSoMienGiam]);
            //        cellHeSoMienGiam.Value = string.Format("{0}%", heSoMienGiam * 100);
            //    }
            //    catch
            //    {
            //        //cellHeSoMienGiam.Value = "Lỗi";
            //    }
            //    DataGridViewLinkCell link = row.Cells[colSinhVien_TrangThai.Index] as DataGridViewLinkCell;
            //    object oTrangThai = row.Cells[colSinhVien_TrangThai.Index].Value;
            //    if (oTrangThai != null && oTrangThai != DBNull.Value)
            //    {
            //        string trangThai = oTrangThai.ToString();
            //        if (trangThai == BizSinhVien.Status_Error_LopSinhHoatChuaTonTai)
            //        {
            //            link.Style.BackColor = link.Style.SelectionBackColor = Color.Red;
            //            link.ActiveLinkColor = link.LinkColor = link.Style.ForeColor = link.Style.SelectionForeColor = Color.White;
            //        }
            //        else if (trangThai == BizSinhVien.Status_Error_DuLieuSinhVienChuaDayDu)
            //        {
            //            link.Style.BackColor = link.Style.SelectionBackColor = Color.Pink;
            //            link.ActiveLinkColor = link.LinkColor = link.Style.ForeColor = link.Style.SelectionForeColor = Color.White;
            //        }
            //        else if (trangThai == BizSinhVien.Status_Error_DuLieuSinhVienKhongNhatQuan)
            //        {
            //            link.ActiveLinkColor = link.LinkColor = link.Style.ForeColor = link.Style.SelectionForeColor = Color.Magenta;
            //        }
            //        else if (trangThai == BizSinhVien.Status_Error_DuLieuSinhVienDaTonTai)
            //        {
            //            link.ActiveLinkColor = link.LinkColor = link.Style.ForeColor = link.Style.SelectionForeColor = Color.Gray;
            //            link.LinkBehavior = LinkBehavior.NeverUnderline;
            //        }
            //        else
            //        {
            //            link.ActiveLinkColor = link.LinkColor = link.Style.ForeColor = link.Style.SelectionForeColor = Color.Green;
            //            link.LinkBehavior = LinkBehavior.NeverUnderline;
            //        }

            //    }
            //}
        }

        private void OnNapDuLieuClick(object sender, EventArgs e)
        {
            // Tiến hành nạp các sinh viên vào hệ thống
            try
            {
                epMain.Clear();
                #region 01. Xác định trường
                Truong truong = null;
                if (cbxTruong.SelectedItem != null)
                    truong = cbxTruong.SelectedItem as Truong;
                if (truong == null)
                {
                    epMain.SetError(cbxTruong, "Phải xác định trường!");
                    return;
                }
                #endregion

                #region 02. Xác định học kỳ
                if (m_HocKy == null)
                {
                    epMain.SetError(txtHocKy, "Phải xác định học kỳ");
                    return;
                }
                #endregion

                #region 03. Xác định năm tuyển sinh
                int namTuyenSinh = -1;
                try
                {
                    namTuyenSinh = int.Parse(txtNamTuyenSinh.Text.Trim());
                }
                catch
                {
                    namTuyenSinh = -1;
                }
                if (namTuyenSinh < 0)
                {
                    epMain.SetError(txtNamTuyenSinh, "Thông tin năm tuyển sinh không hợp lệ");
                    return;
                }
                #endregion

                #region 04. Kiểm tra nguồn dữ liệu
                bsSinhVien.EndEdit();
                DataTable dt = bsSinhVien.DataSource as DataTable;
                if (dt == null)
                    throw new Exception("Chưa xác định được nguồn dữ liệu");
                dt.AcceptChanges();
                #endregion

                //Xác định phụ thu
                bool phuThu = chkPhuThu.Checked;
                // Thực hiện cập nhật
                FormProgress frm = new FormProgress();
                frm.DoWork += delegate(object oSender, DoWorkEventArgs oE)
                {
                    string logDirPath = string.Format("{0}\\LOG", Application.StartupPath);
                    if (System.IO.Directory.Exists(logDirPath) == false)
                        System.IO.Directory.CreateDirectory(logDirPath);
                    string logFile = string.Format("{0}\\LOG\\{1}.log", Application.StartupPath, DateTime.Now.ToString("yyyyMMdd-HHmmss"));
                    BizSinhVien.NapDuLieuSinhVienKhongChuyen(
                        Program.NguoiSuDung.TenDangNhap,
                        truong,
                        m_HocKy,
                        namTuyenSinh,
                        phuThu,
                        dt,
                        logFile);
                };
                frm.RunWorkerCompleted += delegate(object oSender, RunWorkerCompletedEventArgs oE)
                {
                    if (oE.Error != null)
                    {
                        string msg = oE.Error.Message;
                        if (oE.Error.InnerException != null)
                            msg += oE.Error.InnerException.Message;
                        DialogUtils.ShowError(msg);
                    }
                    //else
                        //DialogUtils.ShowMessage("Đã nạp xong");
                };
                frm.StartWorking(this);
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(exc.Message + "\n\n" + exc.InnerException.Message);
            }
        }

        private void OnCopyCellToClipboardClick(object sender, EventArgs e)
        {
            DataGridViewCell currentCell = gridSinhVien.CurrentCell;
            if (currentCell != null)
            {
                object value = currentCell.Value;
                Clipboard.SetDataObject(value);
            }
            else
                DialogUtils.ShowError("Chọn một ô trước khi thực hiện chức năng này!");
        }

        #region Chọn trường
        private void OnLoad(object sender, EventArgs e)
        {
            #region Gắn dữ liệu
            colSinhVien_MaSinhVien.DataPropertyName = BizSinhVien.Col_MaSinhVien;
            colSinhVien_HoDem.DataPropertyName = BizSinhVien.Col_HoDem;
            colSinhVien_Ten.DataPropertyName = BizSinhVien.Col_Ten;
            colSinhVien_NgaySinh.DataPropertyName = BizSinhVien.Col_NgaySinh;
            colSinhVien_TenLop.DataPropertyName = BizSinhVien.Col_TenLopGoc;
            colSinhVien_SoTien.DataPropertyName = BizSinhVien.Col_SoTien;
            colSinhVien_TenLopHocPhan.DataPropertyName = BizSinhVien.Col_TenLopHocPhan;
            colSinhVien_HeSoMienGiam.DataPropertyName = BizSinhVien.Col_HeSoMienGiam;
            colSinhVien_GhiChu.DataPropertyName = BizSinhVien.Col_GhiChu;
            colSinhVien_IsImported.DataPropertyName = BizSinhVien.Col_ImportThanhCong;
            gridSinhVien.AllowUserToAddRows = true;
            gridSinhVien.AllowUserToDeleteRows = true;
            gridSinhVien.AutoGenerateColumns = false;
            #endregion
            bsSinhVien.DataSource = null;
            gridSinhVien.DataSource = bsSinhVien;

            // Nạp danh sách trường
            cbxTruong.DisplayMember = "TenTruong";
            cbxTruong.ValueMember = "MaTruong";
            cbxTruong.DataSource = BizTruong.GetList_Truong();
            HienThiTruong();
        }

        private void HienThiTruong()
        {
            if (m_Truong != null)
                cbxTruong.SelectedValue = m_Truong.MaTruong;
        }
        #endregion

        #region Chọn học kỳ
        private void OnLnkChonHocKyLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var frm = new DuLieu.SelectHocKyDialog();
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                m_HocKy = frm.SelectedHocKy;
                HienThiHocKy();
            }
        }

        private void HienThiHocKy()
        {
            if (m_HocKy == null)
            {
                txtHocKy.Text = "";
            }
            else
            {
                txtHocKy.Text = string.Format("Học kỳ {0} năm học {1}",
                    m_HocKy.SoHieuHocKy, m_HocKy.NamHoc);
            }
        }
        #endregion

        private void OnUndoClick(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "*.LOG|*.log";
            dlg.InitialDirectory = Application.StartupPath + "\\LOG";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                FormProgress frm = new FormProgress();
                string msg = "";
                frm.DoWork += delegate(object oSender, DoWorkEventArgs oE)
                {
                    msg = BizSinhVien.UndoNapDuLieuSinhVienKhongChuyen(dlg.FileName);                    
                };
                frm.RunWorkerCompleted += delegate(object oSender, RunWorkerCompletedEventArgs oE)
                {
                    DialogUtils.ShowMessage(msg);
                };
                frm.StartWorking(this);
            }
        }

        private void OnToolStripButton1Click(object sender, EventArgs e)
        {
            bsSinhVien.EndEdit();
            DataTable dt = bsSinhVien.DataSource as DataTable;
            if (dt == null)
                throw new Exception("Chưa xác định được nguồn dữ liệu");
            if (bsSinhVien.Current != null)
            {
                bsSinhVien.RemoveCurrent();
                dt.AcceptChanges();
            }
        }
    }
}
